package br.com.erpcortume.beans;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.erpcortume.enums.EnumFormaPagamento;
import br.com.erpcortume.enums.EnumRecebimentoMercadoria;
import br.com.erpcortume.enums.EnumStatusManifesto;

@Entity
@Table(name = "manifesto")
public class Manifesto {

	private int id;
	private Cliente cliente;
	private Calendar dataCriacao;
	private String dataPedido;
	private String dataPagamento;
	private Entrega entrega;
	private List<Funcionario> funcionarios;
	private EnumFormaPagamento formaPagamento;
	/* private Fermentacao fermentacao; */
	private BigDecimal valorTotal;
	private String observacao;
	private EnumRecebimentoMercadoria tipoRecebimento;
	private EnumStatusManifesto status;
	private boolean ativo;
	private List<Produto> produtos;

	@Id
	@SequenceGenerator(name = "sequenceGenerator", sequenceName = "manifesto_seq", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequenceGenerator")
	@Column(name = "id", unique = true, nullable = false)
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "id_cliente")
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@Column(name = "data_criacao")
	@Temporal(TemporalType.DATE)
	public Calendar getDataCriacao() {
		return dataCriacao;
	}

	public void setDataCriacao(Calendar dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	@Column(name = "data_pedido")
	public String getDataPedido() {
		return dataPedido;
	}

	public void setDataPedido(String dataPedido) {
		this.dataPedido = dataPedido;
	}

	@ManyToOne
	@JoinColumn(name = "id_entrega")
	public Entrega getEntrega() {
		return entrega;
	}

	public void setEntrega(Entrega entrega) {
		this.entrega = entrega;
	}


	@JoinTable(name = "funcionarios_manifesto", joinColumns = { 
			@JoinColumn(name = "id_manifesto", referencedColumnName = "id") }, inverseJoinColumns = { 
			@JoinColumn(name = "id_funcionario", referencedColumnName = "id") })
	@ManyToMany
	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	@Column(name = "forma_pagamento")
	@Enumerated(EnumType.ORDINAL)
	public EnumFormaPagamento getFormaPagamento() {
		return formaPagamento;
	}

	public void setFormaPagamento(EnumFormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	@Column(name = "data_pagamento")
	public String getDataPagamento() {
		return dataPagamento;
	}

	public void setDataPagamento(String dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	@Column(name = "valor_total")
	public BigDecimal getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(BigDecimal valorTotal) {
		this.valorTotal = valorTotal;
	}

	@Column(name = "observacao")
	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@Column(name = "tipo_recebimento")
	@Enumerated(EnumType.ORDINAL)
	public EnumRecebimentoMercadoria getTipoRecebimento() {
		return tipoRecebimento;
	}

	public void setTipoRecebimento(EnumRecebimentoMercadoria tipoRecebimento) {
		this.tipoRecebimento = tipoRecebimento;
	}

	@Column(name = "staus")
	@Enumerated(EnumType.ORDINAL)
	public EnumStatusManifesto getStatus() {
		return status;
	}

	public void setStatus(EnumStatusManifesto status) {
		this.status = status;
	}

	@Column(name = "ativo")
	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "manifesto", cascade = CascadeType.PERSIST)
	public List<Produto> getProdutos() {
		return produtos;
	}

	public void setProdutos(List<Produto> produtos) {
		this.produtos = produtos;
	}

	public BigDecimal calculaComisao() {

		double total = 0;
		for (Funcionario f : funcionarios) {
			if (f.isRepresentante()) {

				double val = 0;

				for (int i = 0; i < produtos.size(); i++) {

					val += 1;
				}

				BigDecimal comissao = f.getSalario().getComissao();
				comissao.add(new BigDecimal(val / 100));

				total = comissao.doubleValue();
			}
		}
		return new BigDecimal(total);

	}

}